package logica.jugadores;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
import java.util.Collections;

import ValueObjects.VOJugador;
import ValueObjects.VOJugadorRanking;
import ValueObjects.VOPartida;

public class Jugadores implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	private TreeMap <String, Jugador> abb;

	public Jugadores() {
		abb = new TreeMap<String, Jugador>();
	}	
	
	public void Insert(Jugador Jugador){
		abb.put(Jugador.getNombre(), Jugador);		
	}
	
	public boolean Member(String nombre){
		return abb.containsKey(nombre);
	}
	
	public Jugador Find(String nombre){
		return abb.get(nombre);		
	}
	
	public VOJugador[] ListarPorNombre(){
		 
		Iterator<Jugador> iter = abb.values().iterator();
		VOJugador[] arr = new VOJugador[abb.size()];
		int posicion = 0;
		
		while(iter.hasNext()){
			Jugador xoJugador = iter.next(); 
			VOJugador vj = new VOJugador(xoJugador.getNombre(), xoJugador.getCodigo(), xoJugador.getPuntajeAlMomento(),xoJugador.getCantidadAcertadas(),xoJugador.getCantidadErradas());
		    arr[posicion] = vj;
		    posicion++;
		}				
		
		return arr;
	}
	
	public VOPartida[] ListarPartidasPorJugador(String nombre){
		 
		
		VOPartida[] arr = new VOPartida[0]; //0 = tamanio de las partidas
		Jugador xoJugador=Find(nombre);
		arr =xoJugador.listarPartidas();
		
		return arr;
	}
	
	public boolean VerificarCodigo(String nombre,String codigo){
		
		Jugador xoJugador=Find(nombre);
		if(xoJugador.getCodigo().equals(codigo))
			return true;
		else
			return false;
		
	}
	


	public ArrayList<VOJugadorRanking> listarPorpuntaje() {
		ArrayList<VOJugadorRanking> ranking = new ArrayList<>();
		Iterator<Jugador> iter = abb.values().iterator();
		while(iter.hasNext()){
			Jugador j = (Jugador)iter.next();
			VOJugadorRanking jugador = new VOJugadorRanking(j.getNombre(), j.getPuntajeAlMomento(), j.getCantidadAcertadas(), j.getCantidadErradas());
			ranking.add(jugador);
		}
		Collections.sort(ranking, new Comparator<VOJugadorRanking>() {
			@Override
			public int compare(VOJugadorRanking j1, VOJugadorRanking j2) {
				return new Integer(j2.getPuntajeAlMomento()).compareTo(new Integer(j1.getPuntajeAlMomento()));
			}
		});	
		
		return ranking;
	}
	
}

	
